]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
overview: Load RemoteSearchProviders
authorFlorian Müllner <fmuellner@gnome.org>
Thu, 15 Dec 2011 13:46:12 +0000 (14:46 +0100)
committerFlorian Müllner <fmuellner@gnome.org>
Tue, 21 Feb 2012 22:00:53 +0000 (23:00 +0100)
Allow applications to register search providers by dropping a keyfile
into a well-known directory. For now, initialize all found providers;
long term, we probably want to give users the ability to restrict the
set of active search providers.

https://bugzilla.gnome.org/show_bug.cgi?id=663125

js/ui/overview.js
js/ui/remoteSearch.js

index 566d3f1a4f02d7ef2096bfc31877d10af3d24fec..9db4c3d1dbc302d587b7f648cae36351c342e78b 100644 (file)
@@ -21,6 +21,7 @@ const MessageTray = imports.ui.messageTray;
 const Panel = imports.ui.panel;
 const Params = imports.misc.params;
 const PlaceDisplay = imports.ui.placeDisplay;
+const RemoteSearch = imports.ui.remoteSearch;
 const Tweener = imports.ui.tweener;
 const ViewSelector = imports.ui.viewSelector;
 const Wanda = imports.ui.wanda;
@@ -210,6 +211,9 @@ const Overview = new Lang.Class({
         this.addSearchProvider(new DocDisplay.DocSearchProvider());
         this.addSearchProvider(new ContactDisplay.ContactSearchProvider());
 
+        // Load remote search providers provided by applications
+        RemoteSearch.loadRemoteSearchProviders(Lang.bind(this, this.addSearchProvider));
+
         // TODO - recalculate everything when desktop size changes
         this._dash = new Dash.Dash();
         this._group.add_actor(this._dash.actor);
index 18e57497adb9646c11dc31f4d492322127f4e683..c0aa985e6878c127e78ceb358f1cae163ea3bce6 100644 (file)
@@ -1,11 +1,15 @@
 // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
 
 const Gio = imports.gi.Gio;
+const GLib = imports.gi.GLib;
 const Lang = imports.lang;
 const St = imports.gi.St;
 
+const FileUtils = imports.misc.fileUtils;
 const Search = imports.ui.search;
 
+const KEY_FILE_GROUP = 'Shell Search Provider';
+
 const SearchProviderIface = <interface name="org.gnome.Shell.SearchProvider">
 <method name="GetInitialResultSet">
     <arg type="as" direction="in" />
@@ -28,6 +32,56 @@ const SearchProviderIface = <interface name="org.gnome.Shell.SearchProvider">
 var SearchProviderProxy = Gio.DBusProxy.makeProxyWrapper(SearchProviderIface);
 
 
+function loadRemoteSearchProviders(addProviderCallback) {
+    let dataDirs = GLib.get_system_data_dirs();
+    for (let i = 0; i < dataDirs.length; i++) {
+        let path = GLib.build_filenamev([dataDirs[i], 'gnome-shell', 'search-providers']);
+        let dir = Gio.file_new_for_path(path);
+        if (!dir.query_exists(null))
+            continue;
+        loadRemoteSearchProvidersFromDir(dir, addProviderCallback);
+    }
+};
+
+function loadRemoteSearchProvidersFromDir(dir, addProviderCallback) {
+    let dirPath = dir.get_path();
+    FileUtils.listDirAsync(dir, Lang.bind(this, function(files) {
+        for (let i = 0; i < files.length; i++) {
+            let keyfile = new GLib.KeyFile();
+            let path = GLib.build_filenamev([dirPath, files[i].get_name()]);
+
+            try {
+                keyfile.load_from_file(path, 0);
+            } catch(e) {
+                continue;
+            }
+
+            if (!keyfile.has_group(KEY_FILE_GROUP))
+                continue;
+
+            let remoteProvider;
+            try {
+                let group = KEY_FILE_GROUP;
+                let title = keyfile.get_locale_string(group, 'Title', null);
+                let icon = keyfile.get_string(group, 'Icon');
+                let busName = keyfile.get_string(group, 'BusName');
+                let objectPath = keyfile.get_string(group, 'ObjectPath');
+
+                remoteProvider = new RemoteSearchProvider(title,
+                                                          icon,
+                                                          busName,
+                                                          objectPath);
+            } catch(e) {
+                log('Failed to add search provider "%s": %s'.format(title, e.toString()));
+                continue;
+            }
+
+            addProviderCallback(remoteProvider);
+        }
+    }));
+
+};
+
 const RemoteSearchProvider = new Lang.Class({
     Name: 'RemoteSearchProvider',
     Extends: Search.SearchProvider,